{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "e7ce56e8",
   "metadata": {},
   "source": [
    "# 使用窗函数设计FIR带阻滤波器"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "7ffc5193",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "#导入使用的库\n",
    "import numpy as np;from math import *\n",
    "from scipy import signal,fft\n",
    "import matplotlib.pyplot as plt\n",
    "from matplotlib.ticker import MaxNLocator\n",
    "\n",
    "#滤波器参数\n",
    "fs = 250; #抽样频率\n",
    "wp1 = 2*pi*15/fs;wp2 = 2*pi*80/fs #通带截止频率\n",
    "ws1 = 2*pi*40/fs;ws2 = 2*pi*60/fs #阻带截止频率\n",
    "w1 = (wp1+ws1)/2;w2 = (wp2+ws2)/2 \n",
    "Bt = np.array([np.abs(wp1-ws1),np.abs(wp2-ws2)]);Bt = Bt.min() #过渡带宽\n",
    "\n",
    "#由阻带衰减As = 50，可以确定窗形状为海明窗\n",
    "N = np.ceil((6.6*pi)/Bt)+1;N = int(N+(N+1)%2)#滤波器长度点数（取奇数）\n",
    "wn = signal.windows.hamming(N) #海明窗的wn值\n",
    "\n",
    "#理想低通滤波器的单位取样响应\n",
    "t = int((N-1)/2)\n",
    "n1 = np.arange(N);n1 = np.delete(n1,t)\n",
    "hd = (np.sin(pi*(n1-t))-np.sin(w2*(n1-t))+np.sin(w1*(n1-t)))/(pi*(n1-t))\n",
    "hd = np.insert(hd,t,(1-((w2-w1)/pi)))\n",
    "\n",
    "#线性相位FIR滤波器\n",
    "h = hd*wn;N0 = N*1000\n",
    "He = np.abs(fft.fft(h,N0));He = He/np.max(He)\n",
    "Ar = 20*np.log10(He);N1 = int(N0/2);f = np.linspace(0,1,N1)\n",
    "\n",
    "#绘制滤波器的幅度响应\n",
    "fig,ax = plt.subplots();ax.plot(f,Ar[:N1]);ax.grid()\n",
    "ax.set_title('使用海明窗设计的FIR滤波器的幅度响应');ax.set_xlabel('k')\n",
    "ax.set_xlabel(r'$ \\omega / \\pi $')\n",
    "ax.set_ylabel(r'$ 20log_{10}| H (e^{j \\omega}) | $')\n",
    "ax.set_xlim([0,1]);ax.set_ylim([-100,1])\n",
    "ax.xaxis.set_major_locator(MaxNLocator(11))\n",
    "ax.yaxis.set_major_locator(MaxNLocator(11))\n",
    "plt.rcParams['font.sans-serif']=['SimHei'] #用来正常显示中文标签\n",
    "plt.rcParams['axes.unicode_minus'] = False #用来显示负号\n",
    "fig.savefig('./fir_window4.png',dpi=500)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "e4e1923f",
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.8.8"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
